/*
 *Programa Polinomios
 *Lenguajes de programación Grupo: 5
 *Integrantes:
   +Mora Contreras Enrique
   +Pajarito Vargas Antonio
   +Plata Silverio Víctor
   +Ríos Ferrer Kevin
 */
package Controlador;

import java.util.ArrayList;
import java.util.List;
/*
 * Clase estática que contiene las operaciones con polinomios
 */
public class Operaciones {
    static public String mensaje="";
    /*
     * suma los polinomios
     * junta las 2 listas y las reduce con ayuda del metodo redicir
     */
    public static Polinomio sumar(Polinomio pol1,Polinomio pol2){
        if(variablesDistintas(pol1,pol2))
           return null;
            pol1.poli.addAll(pol2.poli);
        pol1.reducir();
        pol1.ordenar();
        pol1.imprimir();
        mensaje="suma realizada correctamente";
        return pol1;
    }
     /*
     * Evalua en un punto el polinomio
     */
    public static float evaluar(Polinomio pol1,float x){
        float resp=0;
        for (int j=0;j<pol1.poli.size();j++){
            resp+=pol1.poli.get(j).coeficiente*Math.pow(x,pol1.poli.get(j).exponente);
        }
        mensaje="Evaluación realizada correctamente";
        return resp;
    } 
    /*
     * resta los polinomios
     * obtiene el opuesto del segundo
     * junta las 2 listas y las reduce con ayuda del metodo redicir
     */
    public static Polinomio restar(Polinomio pol1,Polinomio pol2){
        if(variablesDistintas(pol1,pol2))
            return null;
        pol2=opuesto(pol2);
        pol1.poli.addAll(pol2.poli);
        pol1.reducir();
        pol1.ordenar();
        pol1.imprimir();
        mensaje="resta realizada correctamente";
        return pol1;
    } 
    /*
     * Calcula el opuesto, multiplicando cada coeficiente po -1
     */
    public static Polinomio opuesto(Polinomio pol1){
        for (int j=0;j<pol1.poli.size();j++){
            pol1.poli.get(j).coeficiente=(pol1.poli.get(j).coeficiente*-1);
        }
        pol1.reducir();
        pol1.ordenar();
        pol1.imprimir();
        mensaje="opuesto realizado correctamente";
        return pol1;
    }
    /*
     * Multipica cada elemento del polinomio 1 con cada uno del polinomio 2
     * los almacena en una nueva lista y los reduce
     */
    public static Polinomio multiplicar(Polinomio pol1,Polinomio pol2){
       if(variablesDistintas(pol1,pol2))
           return null;
        List<Monomio> poli= new ArrayList();
        float f_coef=0;
        int i_exp=0;
        for (int i=0;i<pol1.poli.size();i++){
            for (int j=0;j<pol2.poli.size();j++){
                f_coef=pol1.poli.get(i).coeficiente*pol2.poli.get(j).coeficiente;
                i_exp=pol1.poli.get(i).exponente+pol2.poli.get(j).exponente;
                poli.add(new Monomio(f_coef,i_exp));
            }
        }
        pol1.poli=poli;
        pol1.reducir();
        pol1.ordenar();
        pol1.imprimir();
        mensaje="multiplicación realizada correctamente";
        return pol1;
    } 
    /*
     * verifica monomio a monomio de cada polinomio, y los compara
     */
    public static String igualdad(Polinomio pol1,Polinomio pol2){
        if(variablesDistintas(pol1,pol2)){
            mensaje="Diferente variable";
            return "Polinomios distintos";
        }
            
        if(pol1.poli.size()!=pol2.poli.size()){
            mensaje="Tamaño diferente";
            return "Polinomios distintos";
        }
        for (int j=0;j<pol1.poli.size();j++){
            if(pol1.poli.get(j).coeficiente!=pol2.poli.get(j).coeficiente || pol1.poli.get(j).exponente!=pol2.poli.get(j).exponente){
                mensaje="comparación terminada";
                return"Polinomios distintos";
            }
            
        }
        pol1.reducir();
        pol1.ordenar();
        pol1.imprimir();
        mensaje="Operación exitosa";
        return "Polinomios iguales";
    }
    
    /*
     * detrmina si los polinomios tienen diferentes variables
     */
    static boolean variablesDistintas(Polinomio pol1,Polinomio pol2){
        if (!pol1.variable.equals(pol2.variable)) {
            mensaje="Diferentes variables";
            return true;
        }
        else
        return false;
    }
}
